package com.neutech.maplestory.entity;

import com.neutech.maplestory.client.MapleStoryClient;
import com.neutech.maplestory.constant.Constant;
import com.neutech.maplestory.util.ImageUtil;
import com.neutech.maplestory.util.MusicThread;

import java.awt.*;
import java.util.List;
import java.util.Random;

public class Arrow extends AbstractMapleStoryObject {
    /**
     * 加载弓箭的图片数组
     */
    public static Image[] images = {
            ImageUtil.getImage("hero_right_arrow"),
            ImageUtil.getImage("hero_left_arrow")
    };

    /**
     * 弓箭的无参构造方法，用来初始化弓箭的一些属性，例如状态速度，宽高等
     */
    public Arrow() {
        this.live = true;
        this.speed = 20;
        this.width = images[0].getWidth(null);
        this.height = images[0].getHeight(null);
    }

    /**
     * 弓箭的有参构造方法，用来初始化从父类继承过来的属性
     *
     * @param msc 是主函数类，当中介者调用其他类的
     * @param x   弓箭的x坐标
     * @param y   弓箭的y坐标
     * @param dir 弓箭的方向
     */
    public Arrow(MapleStoryClient msc, int x, int y, Direction dir) {
        this();
        this.x = x;
        this.y = y;
        this.dir = dir;
        this.msc = msc;
    }

    /**
     * 画笔
     *
     * @param g 画笔
     */
    @Override
    public void draw(Graphics g) {

        /**
         * 判断当死的时候移除掉创建的弓箭
         */
        if (!live) {
            msc.arrowList.remove(this);
            return;
        }
        /**
         * 判断该方向当方向为那一个是的时候就画哪只弓箭
         */
        switch (dir) {
            case RIGHT:
                g.drawImage(images[0], x, y, null);
                break;
            case LEFT:
                g.drawImage(images[1], x, y, null);
                break;
            default:
                break;
        }
        move();
    }

    /**
     * 弓箭的移动方法，根据方向进行判断
     */
    @Override
    public void move() {
        switch (dir) {
            case RIGHT:
                this.x += speed;
                break;
            case LEFT:
                this.x -= speed;
                break;
            default:
                break;
        }
        outOfBound();
    }

    /**
     * 判断弓箭的边界，如果出界的话就判定弓箭的live为false，如果是false就后悔被移除
     */
    private void outOfBound() {
        if (this.x < -800 || this.x > Constant.GAME_WINDOW_WIDTH) {
            this.live = false;
        }
    }

    /**
     * 随机数
     */
    public Random random = new Random();
    private boolean hitBoss(Boss boss){
        if (this.x >= boss.x && this.x <= (boss.x + 143) && this.y >= boss.y && this.y <= boss.y + 201 && this.live && boss.action != Action.DIE){
            msc.hero.hitValue = (int) (msc.hero.attack * (1 + random.nextDouble()));
            this.live = false;
            new MusicThread("Damage.mp3", false).start();
            Power power = new Power(msc, boss.x, boss.y);
            boss.HP -= power.value;
            if (boss.HP <= 0){
                boss.action = Action.DIE;
                if (random.nextInt(100) < 90) {
                    //如果爆出来了，则new一个新的宝物
                    Item item = new Item(msc, boss.x, boss.y, random.nextInt(6));
                    //把这个new出来的新宝物添加到msc的道具集合里面
                    msc.itemList.add(item);
                    Item item1 = new Item(msc, boss.x, boss.y, random.nextInt(6));
                    msc.itemList.add(item1);
                    Item item2 = new Item(msc, boss.x, boss.y, random.nextInt(6));
                    msc.itemList.add(item2);
                    Item item3 = new Item(msc, boss.x, boss.y, random.nextInt(6));
                    msc.itemList.add(item2);
                    Item item4 = new Item(msc, boss.x, boss.y, random.nextInt(6));
                    msc.itemList.add(item4);
                }
            }
            return true;
        }
        return false;
    }
    public boolean hitBoss(List<Boss> bosses){
            //遍历怪物集合
            for (int i = 0; i < bosses.size(); i++) {
                //拿到每一个怪物
                Boss boss = bosses.get(i);
                //把拿到的每一个怪物传到上面的打击的方法里面
                if (hitBoss(boss)) {
                    return true;
                }
            }
            return false;
    }

    /**
     * 弓箭攻击怪物的方法
     *
     * @param mob 传进来的是怪物
     * @return 返回的是true或者false
     */
    private boolean hit(Mob mob) {
        /**
         * 如果弓箭和怪物碰撞了，并且弓箭是活着的，并且怪物的状态是没有死的，那么进行下面的逻辑
         */
        if (this.getRectangle().intersects(mob.getRectangle()) && this.live && mob.action != Action.DIE) {
            msc.hero.hitValue = (int) (msc.hero.attack * (1 + random.nextDouble()));
            //弓箭变成死的
            this.live = false;
            new MusicThread("Damage.mp3", false).start();
            //创建伤害值
            Power power = new Power(msc, mob.x, mob.y);
            //把new出来的弓箭add进msc里面的powers集合里面进行遍历画出
            msc.powers.add(power);
            mob.HP -= power.value;
            //如果怪物的血量小于等于0，那么怪我的状态变成死的
            if (mob.HP <= 0) {
                mob.action = Action.DIE;
                //调整怪物掉落宝物的概率
                if (random.nextInt(100) < 90) {
                    //如果爆出来了，则new一个新的宝物
                    Item item = new Item(msc, mob.x, mob.y, random.nextInt(6));
                    //把这个new出来的新宝物添加到msc的道具集合里面
                    msc.itemList.add(item);
                }

            }
            return true;
        }
        return false;
    }

    /**
     * 弓箭攻击怪物们
     *
     * @param mobs 怪物群
     * @return 返回true或者false
     */
    public boolean hit(List<Mob> mobs) {
        //遍历怪物集合
        for (int i = 0; i < mobs.size(); i++) {
            //拿到每一个怪物
            Mob mob = mobs.get(i);
            //把拿到的每一个怪物传到上面的打击的方法里面
            if (hit(mob)) {
                return true;
            }
        }
        return false;
    }


}
